// 读写锁
// 使用 10 个 goroutine 进行读操作，每读取一次，sleep 1 毫秒，
// 同时，还有一个 gorotine 进行写操作，每一秒写一次，
// 这是一个 1 writer-n reader 的读写场景，而且写操作还不是很频繁（一秒一次）
package main

import (
	"sync"
	"time"
)

func main() {
	var counter Counter
	for i := 0; i < 10; i++ { // 10个reader
		go func() {
			for {
				counter.Count() // 计数器读操作,1毫秒调用一次,频次较高
				time.Sleep(time.Millisecond)
			}
		}()
	}
	for { // 一个writer
		counter.Incr() // 计数器写操作,1秒钟调用一次,频次较低
		time.Sleep(time.Second)
	}
}

// 一个线程安全的计数器
type Counter struct {
	mu    sync.RWMutex
	count uint64
}

// 使用写锁保护
func (c *Counter) Incr() {
	c.mu.Lock()
	c.count++
	c.mu.Unlock()
}

// 使用读锁保护
func (c *Counter) Count() uint64 {
	c.mu.RLock()
	defer c.mu.RUnlock()
	return c.count
}
